﻿Imports BUS
Imports DTO

Public Class MH_DanhSachHocSinh

    Dim bangHocSinh As New DataTable 'Biến toàn cục lưu bảng HocSinh


    Private Sub MH_DanhSachHocSinh_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Xuất bảng HocSinh vào DataGridView
        Dim HocSinhBUS As New HocSinhBUS
        bangHocSinh = HocSinhBUS.LayBang()
        dgvDanhSach.DataSource = bangHocSinh
        'Load danh sach lop vao cboLop
        Dim lopBUS As New LopBUS
        Dim dsLop As New List(Of LopDTO)
        dsLop = lopBUS.LayDanhSach()
        cboLop.DataSource = dsLop
        cboLop.DisplayMember = ("TenLop")
        cboLop.ValueMember = ("MaLop")
        'gio tinh
        cboGioiTinh.SelectedIndex = 0
        'Label tổng số lớp
        Label4.Text = bangHocSinh.Rows.Count
    End Sub


    Private Sub dgvDanhSach_RowEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvDanhSach.RowEnter
        'Lấy dòng hiện hành rồi xuất vào textbox
        Dim index As Integer = e.RowIndex
        If index >= 0 And index < dgvDanhSach.Rows.Count Then
            txtHoTen.Text = bangHocSinh.Rows(index)("HoTen")
            cboGioiTinh.Text = bangHocSinh.Rows(index)("GioiTinh")
            dtpNgaySinh.Value = DateTime.Parse(bangHocSinh.Rows(index)("NgaySinh"))
            txtDiaChi.Text = bangHocSinh.Rows(index)("DiaChi")
            txtEmail.Text = bangHocSinh.Rows(index)("Email")
            cboLop.SelectedValue = Integer.Parse(bangHocSinh.Rows(index)("MaLop"))
        End If
    End Sub

    'Ham kiem tra nhap dung qui dinh
    Private Function KiemTra() As String
        Dim strError As String = ""
        'kiem tra ten ko dc bo trong()
        If (txtHoTen.Text.Trim = "") Then
            strError += "Tên học sinh không dc bỏ trống"
            strError += vbNewLine
        Else
            
            'neu da nhap ten hoc sinh
            Dim ten As String = txtHoTen.Text
            'neu nhap vao 1 ki tu
            If (ten.Length = 1) Then
                strError += "Tên không hợp lệ "
                strError += vbNewLine
            End If
            'tat ca phai la chu
            For i As Integer = 0 To ten.Length - 2
                If (Not Char.IsLetter(ten(i)) And ten(i) <> " ") Then
                    strError += "Tên không hợp lệ "
                    strError += vbNewLine
                    Exit For
                End If
                ' dau va cuoi co khoang trang
                If ((i = 0 And ten(i) = " ") Or (i = ten.Length And ten(i) = " ")) Then
                    strError += "Tên không hợp lệ "
                    strError += vbNewLine
                    Exit For
                End If
                'sau khoang trang phai viet hoa hoac chu cai dau tien phai viet hoa
                If ((ten(i) = " " And Not (Char.IsUpper(ten(i + 1))) Or (Not (Char.IsUpper(ten(0)))))) Then
                    strError += "Tên không hợp lệ "
                    strError += vbNewLine
                    Exit For
                End If
                'nhung chu con lai phai la chu thuong
            Next

            For i As Integer = 0 To ten.Length - 2
                If (Char.IsUpper(ten(i)) And Char.IsLower(ten(i)) And ten(i + 1) <> " ") Then
                    If (Not (Char.IsLower(ten(i + 1)))) Then
                        strError += "Tên không hợp lệ "
                        strError += vbNewLine
                        Exit For
                    End If
                End If
            Next

            If (ten.IndexOf("  ") > 0) Then
                strError += "Tên có chứa 2 khoảng trắng liên tiếp nhau "
                strError += vbNewLine
            End If
        End If

        'kiem tra no da chon Gioi tinh chua
        If (cboGioiTinh.Text = "") Then
            strError += "Bạn chưa chọn giới tính"
            strError += vbNewLine
        End If

        'kiem tra no da nhap dia chi chua
        If (txtDiaChi.Text = "") Then
            strError += "Bạn chưa điền địa chỉ"
            strError += vbNewLine
        End If

        'neu chua nhap email
        Dim email As String = txtEmail.Text
        If (email = "") Then
            strError += "Email không được bỏ trống"
            strError += vbNewLine
        Else
            'neu co email, kiem tra email 
            'cat email va gan vao 1 mang bien str
            Dim str As String()

            Try
                str = email.Split("@")
                'ko co dang a@b.c
                If (str(1).IndexOf(".") < 1) Then
                    strError += "Email sai qui dinh"
                    strError += vbNewLine
                End If
                'neu mang co nho hon 3 phan tu
                If (str.Length < 2) Then
                    strError += "Email sai qui dinh"
                    strError += vbNewLine
                End If

                'email chi dc la chu hoac la so
                For i As Integer = 0 To str.Length - 1
                    For j As Integer = 0 To str(i).Length - 1
                        If (Not (Char.IsLetterOrDigit(str(i)(j)))) Then
                            If (Not (str(i)(j) = ".")) Then
                                strError += "Email chỉ dc chứa chữ và số"
                            End If
                        End If
                    Next
                Next

                Dim flag As Boolean = True
                While flag
                    Try
                        str = str(1).Split(".")
                        For i As Integer = 0 To str.Length - 1
                            For j As Integer = 0 To str(i).Length - 1
                                If (Not (Char.IsLetterOrDigit(str(i)(j)) And Not (str(i)(j) = "."))) Then
                                    strError += "Email chỉ dc chứa chữ và số"
                                End If
                            Next
                        Next
                    Catch ex As Exception
                        flag = False
                    End Try
                End While
            Catch ex As Exception
                strError += "Email sai qui dinh"
                strError += vbNewLine
            End Try

        End If



        Return strError
    End Function



    Private Sub btnThem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnThem.Click
        If (KiemTra() = "") Then
            'Tiến hành thêm và thông báo kết quả
            Dim hsBUS As New HocSinhBUS
            Dim hsDTO As New HocSinhDTO
            hsDTO.HoTen = txtHoTen.Text.Trim()
            hsDTO.GioiTinh = cboGioiTinh.Text
            hsDTO.NgaySinh = dtpNgaySinh.Value
            hsDTO.DiaChi = txtDiaChi.Text.Trim()
            hsDTO.Email = txtEmail.Text.Trim()
            hsDTO.MaLop = cboLop.SelectedValue
            Dim r As Integer = 1

            'Kiểm tra sĩ số xem có thêm dc không
            Dim lopBUS As New LopBUS
            Dim lop As LopDTO = lopBUS.LayLop(hsDTO.MaLop)


            'Lấy bảng tham so
            Dim tsBUS As New ThamSoBUS
            Dim tsTable As New DataTable
            tsTable = tsBUS.LayBang()

            'Gắn các giá trị ra các biến để xử lý
            Dim SiSoToiDa As Integer = tsTable.Rows(0)("SiSoToiDa1Lop")
            Dim TuoiToiThieu As Integer = tsTable.Rows(0)("TuoiToiThieu")
            Dim TuoiToiDa As Integer = tsTable.Rows(0)("TuoiToiDa")
            'Dim SoMonHoc As Integer = tsTable.Rows(0)("SoMonHoc")

            'kiểm tra lại điều kiện r
            'khai báo 1 biến error để nhận lỗi quá tuổi
            Dim errorQuaTuoi As String = ""
            If (DateTime.Now.Year - hsDTO.NgaySinh.Year < TuoiToiThieu Or DateTime.Now.Year - hsDTO.NgaySinh.Year > TuoiToiDa) Then
                r = 0
                errorQuaTuoi += "Tuổi không nằm trong giới hạn qui định"
            End If

            'nếu sĩ số lớp đó đã đặt tối đa
            'flagVuotQuaSiSo để xác định có vượt qua sĩ số của lop ko
            Dim flagVuotQuaSiSo As Integer = 0
            If (lop.SiSo >= SiSoToiDa) Then
                r = 0
                flagVuotQuaSiSo = 1
            End If
            If (r = 1) Then
                hsBUS.ThemHocSinh(hsDTO)
                lop.SiSo += 1
                lopBUS.CapNhatLop(lop)
                MessageBox.Show("Thêm thành công.")
                'Xuất lại bảng môn học sau khi thêm vào DataGridView
                bangHocSinh = hsBUS.LayBang()
                dgvDanhSach.DataSource = bangHocSinh
                'Label tổng số lớp
                Label4.Text = bangHocSinh.Rows.Count
            Else
                MessageBox.Show("Thêm thất bại.")
                If (flagVuotQuaSiSo) Then
                    MessageBox.Show("Vượt quá sĩ số tối đa của 1 lớp")
                End If
                If (errorQuaTuoi <> "") Then
                    MessageBox.Show(errorQuaTuoi)
                End If
            End If
        Else
            MessageBox.Show(KiemTra())
        End If
    End Sub

    Private Sub btnXoa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnXoa.Click
        'Nếu dòng hiện hành tồn tại
        If dgvDanhSach.CurrentRow IsNot Nothing Then
            'Lấy mã học sinh của dòng hiện hành
            Dim i As Integer = dgvDanhSach.CurrentRow.Index
            bangHocSinh = dgvDanhSach.DataSource

            'Tiến hành thêm và thông báo kết quả
            Dim hsBUS As New HocSinhBUS()
            Dim hsDTO As New HocSinhDTO()
            hsDTO.MaHocSinh = Integer.Parse(bangHocSinh.Rows(i)("MaHocSinh"))
            Dim r As Integer = hsBUS.XoaHocSinh(hsDTO)
            If r = 1 Then
                MessageBox.Show("Xóa thành công.")
                'Xuất lại bảng môn học sau khi xóa trên DataGridView
                bangHocSinh = hsBUS.LayBang()
                dgvDanhSach.DataSource = bangHocSinh
                'Label tổng số lớp
                Label4.Text = bangHocSinh.Rows.Count
            Else
                MessageBox.Show("Xóa thất bại.")
            End If
        End If
    End Sub

    Private Sub btnCapNhat_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCapNhat.Click
        If (KiemTra() = "") Then
            'Nếu dòng hiện hành tồn tại
            If dgvDanhSach.CurrentRow IsNot Nothing Then
                'Lấy mã học sinh của dòng hiện hành
                Dim i As Integer = dgvDanhSach.CurrentRow.Index
                bangHocSinh = dgvDanhSach.DataSource
                Dim hsDTO As New HocSinhDTO()
                hsDTO.MaHocSinh = Integer.Parse(bangHocSinh.Rows(i)("MaHocSinh"))
                hsDTO.HoTen = txtHoTen.Text.Trim()
                hsDTO.GioiTinh = cboGioiTinh.Text
                hsDTO.NgaySinh = dtpNgaySinh.Value
                hsDTO.DiaChi = txtDiaChi.Text.Trim()
                hsDTO.Email = txtEmail.Text.Trim()
                'Tiến hành cập nhật và thông báo kết quả
                Dim hsBUS As New HocSinhBUS()
                Dim r As Integer = hsBUS.CapNhatHocSinh(hsDTO)
                If r = 1 Then
                    MessageBox.Show("Cập nhật thành công.")
                    'Xuất lại bảng môn học sau khi cập nhật trên DataGridView
                    bangHocSinh = hsBUS.LayBang()
                    dgvDanhSach.DataSource = bangHocSinh
                Else
                    MessageBox.Show("Cập nhật thất bại.")
                End If
            End If
        Else
            MessageBox.Show(KiemTra())
        End If

    End Sub
End Class